#include "glwidget.h"

GLWidget::GLWidget(QWidget *parent, bool fs)
    : QGLWidget(parent)
{
    fullscreen = fs;
    setGeometry(0,0, 640, 480);
//    setCaption("");
    if (fullscreen) {
        showFullScreen();
    }
}

GLWidget::~GLWidget()
{

}

/**
 * @brief Widget::initializeGL - 对opengl进行初始化设置，该函数直到窗口创建之后才会被调用
 */
void GLWidget::initializeGL()
{
    /*启用阴影平滑。阴影平滑通过多边形精细的混合色彩，并对外部光进行平滑*/
    glShadeModel( GL_SMOOTH );

    /*设置清除屏幕时所用的颜色。色彩值的范围从0.0到1.0. 0.0代表最黑的情况，1.0代表最亮的情况*/
    glClearColor(0.0, 0.0, 0.0, 0.0);

    /*设置深度缓存*/
    glClearDepth(1.0);
    /*启用深度测试*/
    glEnable( GL_DEPTH_TEST );
    /*所作深度测试的类型*/
    glDepthFunc( GL_LEQUAL );

    /*真正精细的透视修正, 这会十分轻微的影响性能，但使用透视图看起来好一点*/
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}

/**
 * @brief Widget::paintGL  -  包括所有绘图代码。任画图的代码都要在这个函数里实现
 */
void GLWidget::paintGL()
{
    /*清除屏幕和深度缓存*/
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    /*重置当前的模型观察矩阵*/
    glLoadIdentity();
}

/**
 * @brief Widget::resizeGL  -  重新设置Opengl场景的大小。与窗口大小不是一个概念
 * @param width     场景宽度
 * @param height    场景高度
 */
void GLWidget::resizeGL(int width, int height)
{
    if (0 == height) {
        /*防止height为0*/
        height = 1;
    }

    /*重置当前的视口*/
    glViewport(0, 0, (GLint)width, (GLint)height);

    /*选择投影矩阵*/
    glMatrixMode( GL_PROJECTION );
    /*重置投影矩阵*/
    glLoadIdentity();

    /*建立透视投影矩阵，Qt4.8以后都不支持glu开头的函数*/
//    gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);

    /*选择模型观察矩阵*/
    glMatrixMode( GL_MODELVIEW );
    /*重置模型观察矩阵*/
    glLoadIdentity();
}

void GLWidget::keyPressEvent(QKeyEvent *e)
{
    switch (e->key()) {
    case Qt::Key_F2:
        fullscreen = !fullscreen;
        if (fullscreen) {
            showFullScreen();
        } else {
            showNormal();
            setGeometry(0,0, 640, 480);
        }
        updateGL();
        break;
    case Qt::Key_Escape:
        close();
        break;
    default:
        break;
    }
}
